package pe.gob.mininter.dirandro.vaadin.panel.bandeja;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import pe.gob.mininter.dirandro.model.NotaInformativa;
import pe.gob.mininter.dirandro.model.Opcion;
import pe.gob.mininter.dirandro.service.NotaInformativaService;
import pe.gob.mininter.dirandro.util.HarecUtil;
import pe.gob.mininter.dirandro.vaadin.panel.documento.PanelRegistroNotaInformativa;
import pe.gob.mininter.dirandro.vaadin.util.DirandroComponent;
import pe.gob.mininter.dirandro.vaadin.util.Injector;
import pe.gob.mininter.dirandro.vaadin.util.TablaFiltro;
import pe.gob.mininter.dirandro.vaadin.util.container.TablaFiltroIndexedContainer;
import pe.gob.mininter.dirandro.vaadin.util.container.TablaFiltroIndexedContainer.TipoComponente;
import pe.gob.mininter.dirandro.vaadin.util.event.TablaFiltroEnterEvent;
import pe.gob.mininter.dirandro.vaadin.util.listener.TablaFiltroEnterListener;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.event.Action;
import com.vaadin.event.Action.Handler;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Panel;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;

public class PanelBandejaNotaInformativa extends DirandroComponent implements TablaFiltroEnterListener, ClickListener  {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private Panel panel_1;
	@AutoGenerated
	private VerticalLayout verticalLayout_2;
	@AutoGenerated
	private TablaFiltro tblBusqueda;
	@AutoGenerated
	private HorizontalLayout lytBotonera;
	@AutoGenerated
	private Button btnBuscar;
	/**
	 * 
	 */
	private static final long serialVersionUID = -925673737555162946L;
	
	public static final String COLUMNA_ID = "id";
	public static final String COLUMNA_NOTA = "nota";
	public static final String COLUMNA_NUMERO = "numero";
	public static final String COLUMNA_FECHA = "fecha";
	public static final String COLUMNA_DEPENDENCIA = "dependencia";
	public static final String COLUMNA_PARTE = "autogenerado";
	public static final String COLUMNA_CREADOR = "creador";
	
	private static final Action MODIFICAR_NOTA = new Action("Modificar Nota Informativa");
	private static final Action[] ITEM_ACTIONS = new Action[] { MODIFICAR_NOTA };
	
	private Action[] action = new Action[] {};
	
	private TablaFiltroIndexedContainer container;
	private NotaInformativaService notaInformativaService;
	private List<Opcion> acciones;
	
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	public PanelBandejaNotaInformativa(List<Opcion> acciones, String height) {
		super(acciones, height);
		
		this.acciones = acciones;
		notaInformativaService = Injector.obtenerServicio(NotaInformativaService.class);
		buildMainLayout();
		setCompositionRoot(mainLayout);
		postConstruct();
		
	}
	
	@Override
	public void attach() {
		super.attach();
		verticalLayout_2.setSizeUndefined();
		verticalLayout_2.setHeight("100%");
	}

	@Override
	public void postConstruct() {
		container = new TablaFiltroIndexedContainer();
		
		container.addContainerProperty(COLUMNA_ID, String.class, StringUtils.EMPTY, "ID", TipoComponente.TEXT, true, 50);
		container.addContainerProperty(COLUMNA_NUMERO, String.class, StringUtils.EMPTY, "Número", TipoComponente.TEXT, true, 100);
		container.addContainerProperty(COLUMNA_FECHA, String.class, StringUtils.EMPTY, "Fecha", TipoComponente.DATEPICKER, false, 100);
		container.addContainerProperty(COLUMNA_DEPENDENCIA, String.class, StringUtils.EMPTY, "Dependencia", TipoComponente.TEXT, true, 200);
		container.addContainerProperty(COLUMNA_PARTE, String.class, StringUtils.EMPTY, "Nro. Parte", TipoComponente.TEXT, true, 200);
		container.addContainerProperty(COLUMNA_CREADOR, String.class, StringUtils.EMPTY, "Creador", TipoComponente.TEXT, true, 200);
		container.addContainerProperty(COLUMNA_NOTA, NotaInformativa.class, null);
		
		tblBusqueda.setContainerDataSource(container);
		tblBusqueda.setColumnCollapsingAllowed(true);
		tblBusqueda.setColumnReorderingAllowed(true);
		tblBusqueda.setSelectable(true);
		tblBusqueda.addListener((TablaFiltroEnterListener)this);
		
		tblBusqueda.setImmediate(true);
		HashMap<String, Object> mapa = new HashMap<String, Object>();
		if( HarecUtil.obtenerUsuarioSesion().getOficina()!=null){
			System.out.println("dependencia "+ HarecUtil.obtenerUsuarioSesion().getOficina().getNombre());
			mapa.put(COLUMNA_DEPENDENCIA, HarecUtil.obtenerUsuarioSesion().getOficina().getNombre());
		}
		buscarNotas(mapa);
		
		btnBuscar.addListener((ClickListener) this);
		
		tblBusqueda.addListener(new ValueChangeListener() {

			/**
			 * 
			 */
			private static final long serialVersionUID = -7070222690010564544L;

			@Override
			public void valueChange(ValueChangeEvent event) {
				
				Integer value = (Integer) event.getProperty().getValue();
				
				tblBusqueda.removeAllActionHandlers();
				
				if (value != null) {
					action = ITEM_ACTIONS;
					asignaActionHandler();
				} 

				tblBusqueda.requestRepaintTable();
			}
		});		
		verticalLayout_2.setSizeUndefined();
		verticalLayout_2.setHeight("100%");
		
	}
	

	private void asignaActionHandler() {
		tblBusqueda.addActionHandler(new Handler() {

			/**
			 * 
			 */
			private static final long serialVersionUID = -6373252406881569655L;

			@Override
			public void handleAction(Action action, Object sender, Object target) {

				if (action.equals(MODIFICAR_NOTA)) {
					
					Object objID = tblBusqueda.getValue();
					
					Item item = container.getItem(objID);
					
					NotaInformativa nota = (NotaInformativa)item.getItemProperty(COLUMNA_NOTA).getValue();
										
					PanelRegistroNotaInformativa panelRegistronota = new PanelRegistroNotaInformativa(acciones, "-1px");
					panelRegistronota.setNotaInformativa(nota);
					
					Window wdHojaRemision = new Window();
					
					wdHojaRemision.setModal(false);
					wdHojaRemision.setResizable(false);
					wdHojaRemision.addComponent(panelRegistronota);
						
					wdHojaRemision.setCaption("Modificar Nota Informativa");
					wdHojaRemision.setWidth("1050px");
					getWindow().addWindow(wdHojaRemision);
				}
			}

			@Override
			public Action[] getActions(Object target, Object sender) {
				return action;
			}
		});
	}

	private void buscarNotas(Map<String, Object> map) {
		
		List<NotaInformativa> notas = notaInformativaService.buscarBandeja(map);
		
		container.removeAllItems();
		int con = 0;
		for (NotaInformativa nota : notas) {
			Item item = container.addItem(con++);
			item.getItemProperty(COLUMNA_ID).setValue(nota.getId());
			item.getItemProperty(COLUMNA_NUMERO).setValue(nota.getNumero() !=null ? nota.getNumero()  : StringUtils.EMPTY);
			item.getItemProperty(COLUMNA_FECHA).setValue(nota.getFechaRegistro() != null ? nota.getFechaRegistro()  : StringUtils.EMPTY);
		//	item.getItemProperty(COLUMNA_DEPENDENCIA).setValue(nota.getDependencia() != null ? nota.getDependencia()  : StringUtils.EMPTY);
			item.getItemProperty(COLUMNA_PARTE).setValue(nota.getParte() != null ? nota.getParte().getAutogenerado()  : StringUtils.EMPTY);
		//	item.getItemProperty(COLUMNA_CREADOR).setValue(nota.getCreador() != null ? nota.getCreador().getNombreCompleto()  : StringUtils.EMPTY);
			item.getItemProperty(COLUMNA_NOTA).setValue( nota );
		}
		
	}

	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnBuscar)) {
			buscarNotas(tblBusqueda.getValues());
		}
	}

	@Override
	public void handleEnterAction(TablaFiltroEnterEvent event) {
		buscarNotas(event.getDatos());
	}

	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(false);
		mainLayout.setSpacing(true);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// lytBotonera
		lytBotonera = buildLytBotonera();
		mainLayout.addComponent(lytBotonera);
		
		// panel_1
		panel_1 = buildPanel_1();
		mainLayout.addComponent(panel_1);
		
		return mainLayout;
	}

	@AutoGenerated
	private HorizontalLayout buildLytBotonera() {
		// common part: create layout
		lytBotonera = new HorizontalLayout();
		lytBotonera.setImmediate(false);
		lytBotonera.setWidth("100.0%");
		lytBotonera.setHeight("-1px");
		lytBotonera.setMargin(false);
		
		// btnBuscar
		btnBuscar = new Button();
		btnBuscar.setCaption("Button");
		btnBuscar.setImmediate(false);
		btnBuscar.setWidth("-1px");
		btnBuscar.setHeight("-1px");
		lytBotonera.addComponent(btnBuscar);
		
		return lytBotonera;
	}

	@AutoGenerated
	private Panel buildPanel_1() {
		// common part: create layout
		panel_1 = new Panel();
		panel_1.setImmediate(false);
		panel_1.setWidth("100.0%");
		panel_1.setHeight("100.0%");
		
		// verticalLayout_2
		verticalLayout_2 = buildVerticalLayout_2();
		panel_1.setContent(verticalLayout_2);
		
		return panel_1;
	}

	@AutoGenerated
	private VerticalLayout buildVerticalLayout_2() {
		// common part: create layout
		verticalLayout_2 = new VerticalLayout();
		verticalLayout_2.setImmediate(false);
		verticalLayout_2.setWidth("100.0%");
		verticalLayout_2.setHeight("100.0%");
		verticalLayout_2.setMargin(false);
		
		// tblBusqueda
		tblBusqueda = new TablaFiltro();
		tblBusqueda.setImmediate(false);
		tblBusqueda.setWidth("100.0%");
		tblBusqueda.setHeight("100.0%");
		verticalLayout_2.addComponent(tblBusqueda);
		
		return verticalLayout_2;
	}

}
